#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define IGUAL	 0
#define MENOR	-1
#define	MAIOR	 1
#define FIN		-2

#define ENV_NUM		1
#define ENV_RESULT	2

struct mensaxe {
	int operacion;
	int dato;
};

int procesar_datos(int dato);

int main(int argc, char *argv[]) {

	int enderezo, porto, sockfd, bEnviados;
	struct sockaddr_in env, rec;
	struct mensaxe men_serv;

	if (argc != 3) {
		printf("Erro, parametros incorrectos. ");
		printf("Usar: <CLIENTE> enderezoIP porto\n");
		exit(EXIT_FAILURE);
	}

	enderezo = inet_addr(argv[1]); //Convertimos o enderezo IP a formato binario
	porto = atoi(argv[2]);

	//Creacion do socket TCP
	sockfd = socket(AF_INET, SOCK_STREAM, 0);

	if (sockfd == -1) {
		perror("Fallo creando o socket");
		exit(EXIT_FAILURE);
	}

	rec.sin_family = AF_INET;
	rec.sin_port = 0;
	rec.sin_addr.s_addr = htonl(INADDR_ANY);

	if ((bind(sockfd, (struct sockaddr *) &rec, sizeof(rec))) == -1) {
		perror("Fallo asignando nome ao socket");
		exit(EXIT_FAILURE);
	}

	env.sin_family = AF_INET;
	env.sin_port = htons(porto);
	env.sin_addr.s_addr = enderezo;

	if ((connect(sockfd, (struct sockaddr *) &env, sizeof(env))) == -1) {
		perror("Fallo intentando conectar");
		exit(-1);
	}

	printf("Conexion establecida co servidor. Este xogo consiste en adivinhar un numero\n");
	printf("arbitrario que o servidor escolle aleatoriamente entre 0 e 100. Probe e boa sorte\n");
	while (1) {
		int numero = -1;
		printf("Introduza un numero:  ");
		scanf("%i", &numero);

		struct mensaxe m;
		m.operacion = ENV_NUM;
		m.dato = numero;

		bEnviados=send(sockfd, &m, sizeof(struct mensaxe), 0);

		if (bEnviados == -1) {
			perror("Fallo ao enviar os datos");
			exit(-1);
		}

		// Esperamos recibir resposta por parte do servidor
		recv(sockfd, &men_serv, sizeof(struct mensaxe), 0);

		int tmp = procesar_datos(men_serv.dato);
		if ( tmp == FIN || tmp == IGUAL)
			break;
		puts("");
	}

	close(sockfd);

	exit(EXIT_SUCCESS);

}

int procesar_datos(int dato) {
	switch (dato) {
	case MENOR:
		printf("O numero e MENOR ca o do servidor, intenteo de novo\n");
		break;
	case IGUAL:
		printf("O numero e IGUAL ca o do servidor, noraboa ganhou\n");
		break;
	case MAIOR:
		printf("O numero e MAIOR ca o do servidor, intenteo de novo\n");
		break;
	case FIN:
		printf("Acadouse o numero maximo de intentos, volva outro dia\n");
		break;
	}
	return dato;
}
